//
//  HMSinaUserAccountViewModel.swift
//  ZJCSina
//
//  Created by 朱建超 on 16/11/17.
//  Copyright © 2016年 itHeiMa. All rights reserved.
//

/*
 1、封装数据逻辑处理
 2、封装网络请求
 3、 封装数据缓存
 */

import UIKit

class HMSinaUserAccountViewModel: NSObject {

    //视图模型需要引用 模型对象  --->  视图模型需要处理数据逻辑
    var userAccount : HMSinaUserAccount?
    
    var access_token : String{
    
        return (userAccount?.access_token)!
    
    }
    
    //增加一个永用户头像地址的url
    var headURL : URL?{
    
        return URL(string: userAccount?.avatar_large ?? "")
    
    }
    
    //判断用户是否登录
    //计算型属性
    var userLogin : Bool{
    
        //满足以下条件就认为用户已经登录
        if userAccount?.access_token != nil && guoQi_time == false {
         
            return true
            
        }
        
        //默认没有登录
        return false
    
    }
    
    //判断令牌是否过期
    var guoQi_time : Bool{
    
        //满足一下条件就没有过期
        //过期日期比当前日期大的时候，就没有过期
        if userAccount?.guoQi_time?.compare(Date()) == ComparisonResult.orderedDescending {
            return false
        }
        
        //默认过期
        return true
    
    }
    
    //单例对象，全局只有一个登陆的用户，之存储一个用户的account.plist文件，一旦用户注销登陆之后，就应该删除account.plist
    static let shared : HMSinaUserAccountViewModel = HMSinaUserAccountViewModel()
    
    //重写构造函数，在用户已经登录的情况下给模型赋值
    override init() {
        
        super.init()
        
        //保证以后在判断是否登录的时候，不在访问磁盘。
        //将磁盘数据保存在内存中
        userAccount = self.loadUserAccountInfo()
        
    }
 
    //获取用户token的方法
    func loadAccesstoken(code : String , finished : @escaping (Bool) -> ()) {
        
        //https://api.weibo.com/oauth2/access_token
        
        let urlString = "https://api.weibo.com/oauth2/access_token"
        
        let parameters = ["client_id" : client_id,
                          "client_secret" : client_secret,
                          "grant_type" : "authorization_code",
                          "code" : code,
                          "redirect_uri" : redirect_uri]
        
        HMNetworkTools.shared.request(method: .POST, urlString: urlString, parameters: parameters) { (responseObject, error) in
            
            if error != nil{
                
//                SVProgressHUD.showError(withStatus: "世界上最遥远的距离就是没有网络")
                finished(false)
                
                return
                
            }
            
            //使用access_token和uid来获取用户信息
            self.loadUserInfo(dict: responseObject as! [String : Any] , finished: finished)
            
        }
        
    }
    
    
    //获取用户信息的方法
    private func loadUserInfo(dict : [String : Any] , finished : @escaping (Bool) -> ()) {
        
        let urlString = "https://api.weibo.com/2/users/show.json"
        
        let token = dict["access_token"]
        let uid = dict["uid"]
        
        let parameters = ["access_token" : token,
                          "uid" : uid]
        
        HMNetworkTools.shared.request(method: .GET, urlString: urlString, parameters: parameters) { (responseObject, error) in
            
            if error != nil{
                
//                SVProgressHUD.showError(withStatus: "世界上最遥远的距离就是没有网络")
                
                //执行失败的回调
                finished(false)
                
                return
                
            }
            
            //将用户信息存储在本地
            //需要将授权后得到的字典和用户信息字典合并，之后再存储
            var userInfoDict = responseObject as! [String : Any]
            
            for (key,value) in dict {
                
                userInfoDict[key] = value
                
            }
            
            //需要将userInforDict转换为模型对象
            //使用归档的方式存储自定义模型对象
            //字典转模型
            let userAccount = HMSinaUserAccount(dict: userInfoDict)
            
            self.saveUserAccountInfo(userAccountInfo: userAccount)
            
            //给单例对象的模型对象赋值
            //如果不写，首次登录的时候会有bug
            self.userAccount = userAccount
            
            let userAccountInfo = self.loadUserAccountInfo()
            
            print(userAccountInfo ?? 0)
            
            //执行成功的回调
            finished(true)
            
        }
        
    }
    
    //存储模型对象
    private func saveUserAccountInfo(userAccountInfo : HMSinaUserAccount) {
        
        //存储在沙盒的Document或者Library
        //拼接文件路径的方法，String没有，需要转换为NSString
        //使用默认转换的前提是：被转换的类型不能是可选类型
        let path = (NSSearchPathForDirectoriesInDomains(.documentDirectory , .userDomainMask , true).last! as NSString).appendingPathComponent("account.plist")
        
        //存储自定义对象，自定义对象必须遵守NSCoding协议，实现协议的方法
        NSKeyedArchiver.archiveRootObject(userAccountInfo, toFile: path)
        
        print(path)
        
    }
    
    //解档用户信息的方法
    //读取磁盘
    func loadUserAccountInfo() -> HMSinaUserAccount?{
        
        let path = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as NSString).appendingPathComponent("account.plist")
        
        let userAccountInfo = NSKeyedUnarchiver.unarchiveObject(withFile: path)
        
        if let userAccountInfo = userAccountInfo as? HMSinaUserAccount {
            
            return userAccountInfo
            
        }
        return nil
    }

    
}
